"""
https://leetcode.cn/problems/simplify-path/description/

71. 简化路径
已解答
中等
相关标签
相关企业
给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为 更加简洁的规范路径。

在 Unix 风格的文件系统中规则如下：

一个点 '.' 表示当前目录本身。
此外，两个点 '..' 表示将目录切换到上一级（指向父目录）。
任意多个连续的斜杠（即，'//' 或 '///'）都被视为单个斜杠 '/'。
任何其他格式的点（例如，'...' 或 '....'）均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式：

始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名（如果存在）不能 以 '/' 结尾。
此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
返回简化后得到的 规范路径 。

 

示例 1：

输入：path = "/home/"

输出："/home"

解释：

应删除尾随斜杠。

示例 2：

输入：path = "/home//foo/"

输出："/home/foo"

解释：

多个连续的斜杠被单个斜杠替换。

示例 3：

输入：path = "/home/user/Documents/../Pictures"

输出："/home/user/Pictures"

解释：

两个点 ".." 表示上一级目录（父目录）。

示例 4：

输入：path = "/../"

输出："/"

解释：

不可能从根目录上升一级目录。

示例 5：

输入：path = "/.../a/../b/c/../d/./"

输出："/.../b/d"

解释：

"..." 在这个问题中是一个合法的目录名。

 

提示：

1 <= path.length <= 3000
path 由英文字母，数字，'.'，'/' 或 '_' 组成。
path 是一个有效的 Unix 风格绝对路径。


"""
class Solution:
    """
    从字面意义上，需要解析`.`,`..`,`//`的含义
    考虑从根开始，记录一个列表，记录每个文件夹名，最后通过/返回
    """
    def simplifyPath(self, path: str) -> str:
        dir_list=[]
        dir_name=[]
        for ch in path:
            if ch=='/':
                if dir_name:
                    # push dir name
                    dir_list.append(''.join(dir_name))
                    dir_name=[]
                else:
                    # ignore /
                    continue
            else:
                # record anyway
                dir_name.append(ch)
        if dir_name:
            dir_list.append(''.join(dir_name))
        
        # parse dir name
        res_list=[]
        for dir_name in dir_list:
            if dir_name=='.':
                # ignore .
                continue
            elif dir_name=='..':
                # back ..
                if res_list:
                    res_list.pop()
            else:
                res_list.append(dir_name)
            pass

        return '/'+'/'.join(res_list)

if __name__=='__main__':
    sol=Solution()
    str='/.../a/../b/c/../d/./'
    res=sol.simplifyPath(str)
    print(res)
    pass